package chapter02;

import java.io.InputStream;
import java.util.Scanner;

public class MyUtil {
    /**
     * 交换T类型一维数组的两个元素
     *
     * @param <T> 类型参数T
     * @param a   T类型一维数组
     * @param k   待交换的元素1的下标
     * @param i   待交换的元素2的下标
     */
    public static <T> void swap(T[] a, int k, int i) {
        T temp = a[k];
        a[k] = a[i];
        a[i] = temp;
    }

    /**
     * 交换int类型一维数组的两个元素
     *
     * @param a int类型一维数组
     * @param i 待交换的元素1的下标
     * @param j 待交换的元素2的下标
     */
    public static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    /**
     * 交换float类型一维数组的两个元素
     *
     * @param a float类型一维数组
     * @param i 待交换的元素1的下标
     * @param j 待交换的元素2的下标
     */
    public static void swap(float[] a, int i, int j) {
        float temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    /**
     * 交换int类型二维数组的两个元素
     *
     * @param m  int类型二维数组
     * @param r1 待交换的元素1的行下标
     * @param c1 待交换的元素1的列下标
     * @param r2 待交换的元素2的行下标
     * @param c2 待交换的元素2的列下标
     */
    public static void swap(int[][] m, int r1, int c1, int r2, int c2) {
        int temp = m[r1][c1];
        m[r1][c1] = m[r2][c2];
        m[r2][c2] = temp;
    }

    /**
     * 输出int类型的一维数组
     *
     * @param a int类型的一维数组
     * @param s 开始下标
     */
    public static void printA(int[] a, int s) {
        for (int i = s; i < a.length; i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }

    /**
     * 输出int类型的一维数组
     *
     * @param a int类型的一维数组
     */
    public static void printA(int[] a) {
        printA(a, 0);
    }

    /**
     * 输出float类型的一维数组
     *
     * @param a float类型的一维数组
     * @param s 开始下标
     *
     */
    public static void printA(float[] a, int s) {
        for (int i = s; i < a.length; i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }

    /**
     * 输出float类型的一维数组
     *
     * @param a float类型的一维数组 *
     */
    public static void printA(float[] a) {
        printA(a, 0);
    }

    /**
     * 输出T类型的一维数组
     *
     * @param a T类型的一维数组
     * @param s 开始下标
     */
    public static <T> void printA(T[] a, int s) {
        for (int i = s; i < a.length; i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }

    /**
     * 输出T类型的一维数组
     *
     * @param a T类型的一维数组
     */
    public static <T> void printA(T[] a) {
        printA(a, 0);
    }

    /**
     * 输出int类型的矩阵
     *
     * @param a 二维数组
     * @param s 开始下标
     * @param w 数据输出的宽度
     */
    public static void printM(int[][] a, int s, int w) {
        for (int i = s; i < a.length; i++) {
            for (int j = s; j < a[0].length; j++) {
                System.out.printf("%" + w + "d", a[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 输出double类型的矩阵
     *
     * @param a 二维数组
     * @param s 开始下标
     * @param w 数据输出的宽度
     */
    public static void printM(float[][] a, int s, int w) {
        for (int i = s; i < a.length; i++) {
            for (int j = s; j < a[0].length; j++) {
                System.out.printf("%" + w + ".2f", a[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 从文件将float类型的数据读入一个二维数组中， 数组下标从s开始。<br/>
     * 文件的第1行为行数 列数，第2行开始为二维数组的数据
     *
     * @param filename 带相对路径的文件名，如:"/ch4/*.txt"
     * @param s        数组的开始下标
     * @return float类型的二维数组
     */
    public static float[][] inputM(String filename, int s) {
        Scanner scanner = null;
        try {
            InputStream fin = MyUtil.class.getResourceAsStream(filename);
            scanner = new Scanner(fin);
        } catch (Exception e) {
            System.out.println("找不到文件！");
        }
        int r = scanner.nextInt();
        int c = scanner.nextInt();
        float[][] m = new float[r + s][c + s];
        for (int i = s; i < r + s; i++) {
            for (int j = s; j < c + s; j++)
                m[i][j] = scanner.nextFloat();
        }
        scanner.close();
        return m;
    }

    /**
     * 从文件将float类型的数据读入一个二维数组中，数组下标从0开始。<br/>
     * 文件的第1行为行数 列数，第2行开始为二维数组的数据
     *
     * @param filename 带相对路径的文件名，如:"/ch4/*.txt"
     * @return float类型的二维数组
     */
    public static float[][] inputM(String filename) {
        return inputM(filename, 0);
    }

    /**
     * 从文件将int类型的数据读入一个二维数组中， 数组下标从s开始。<br/>
     * 文件的第1行为行数 列数，第2行开始为二维数组的数据
     *
     * @param filename 带相对路径的文件名，如:"/ch4/*.txt"
     * @param s        数组的开始下标
     * @return int类型的二维数组
     */
    public static int[][] inputIntM(String filename, int s) {
        Scanner scanner = null;
        try {
            InputStream fin = MyUtil.class.getResourceAsStream(filename);
            scanner = new Scanner(fin);
        } catch (Exception e) {
            System.out.println("找不到文件！");
        }
        int r = scanner.nextInt();
        int c = scanner.nextInt();
        int[][] m = new int[r + s][c + s];
        for (int i = s; i < r + s; i++) {
            for (int j = s; j < c + s; j++)
                m[i][j] = scanner.nextInt();
        }
        scanner.close();
        return m;
    }
}
